package com.masita.logica;

import java.sql.*;
import java.util.Vector;

import com.masita.util.Utilidad;

public class Pedido{
	
	private int id_pedido;
	private int id_ficha;

	private int id_compra;
	private int id_detalle;

	private int id_producto;
	private Producto producto;
	private int id_talle;
	
	private String fecha_pedido;
	private int cantidad;
	private double entrega;
	private String estado;
	
	public Pedido(int id_ped, int id_f, int id_c, int id_det, int id_prod,
				  int id_t, String fec, int c, double ent, String est){
		this.id_pedido = id_ped;
		this.id_ficha = id_f;
		this.id_compra = id_c;
		this.id_detalle = id_det;
		this.id_producto = id_prod;
		this.id_talle = id_t;
		this.fecha_pedido = new String(fec);
		this.cantidad = c;
		this.entrega = ent;
		this.estado = new String(est);
		
		this.producto = null;		
	}

	public Pedido(int id_ped, int id_f, int id_c, int id_det, int id_prod,
				  int id_t, String fec, int c, double ent){
		this.id_pedido = id_ped;
		this.id_ficha = id_f;
		this.id_compra = id_c;
		this.id_detalle = id_det;
		this.id_producto = id_prod;
		this.id_talle = id_t;
		this.fecha_pedido = new String(fec);
		this.cantidad = c;
		this.entrega = ent;
		this.estado = new String(Utilidad.ESTADO_PEDIDO_PENDIENTE);

		this.producto = null;		
	}

	// METODO GET DE LA CLASE *****************************	
	public int getCantidad(){
		return cantidad;
	}

	public double getEntrega(){
		return this.entrega;
	}
	
	public String getFechaPedido(){
		return fecha_pedido;
	}

	public int getIdFicha(){
		return id_ficha;
	}

	public int getIdPedido(){
		return id_pedido;
	}

	public int getIdCompra(){
		return id_compra;
	}

	public int getIdDetalle(){
		return id_detalle;
	}

	public int getIdProducto(){
		return id_producto;
	}

	public int getIdTalle(){
		return id_talle;
	}

	public Producto getProducto(){
		if( this.producto == null && this.id_producto != 0 )
			this.producto = Producto.getProducto(this.id_producto);
		return producto;
	}
	
	public String getEstadoPedido(){
		return this.estado;
	}

	// METODO SET DE LA CLASE *****************************
	public void setCantidad(int i){
		cantidad = i;
	}
	
	public void setEntrega(double ent){
		this.entrega = ent;
	}

	public void setFechaPedido(String string){
		fecha_pedido = new String(string);
	}

	public void setIdFicha(int i){
		id_ficha = i;
	}

	public void setIdProducto(int i){
		id_producto = i;
		this.producto = null;
	}

	public void setIdCompra(int i){
		id_compra = i;
	}

	public void setIdDetalle(int i){
		id_detalle = i;
	}

	public void setIdTalle(int i){
		id_talle = i;
	}

	public void setProducto(Producto prod){
		if( prod != null )
			this.id_producto = prod.getIdProducto();
		this.producto = prod;
	}
	
	public void setEstado(String est){
		this.estado = new String(est);
	}
	
	// METODO DE LA CLASE VARIOS **************************
	public String siguienteEstado(){
		if( this.estado.equals(Utilidad.ESTADO_PEDIDO_PENDIENTE) ){
				this.setEstado(Utilidad.ESTADO_PEDIDO_COMPRADO);
		}
		else if( this.estado.equals(Utilidad.ESTADO_PEDIDO_COMPRADO) ){
				this.setEstado(Utilidad.ESTADO_PEDIDO_ENTREGADO);
		}
		
		this.guardarDatos();
		return this.estado;
	}
	
	// METODO ESTATICOS DE LA CLASE ***********************
	
	public static Pedido getPedido(int id_p, int id_f){
		try{
			Statement st = Conexion.getStatement();
			String sentencia = "SELECT * FROM pedido WHERE id_pedido = "+id_p+
							   " AND id_ficha = "+id_f;
			ResultSet rs = st.executeQuery(sentencia);
			if( rs.next() ){
				return new Pedido(rs.getInt("id_pedido"), rs.getInt("id_ficha"),
						   rs.getInt("id_compra"), rs.getInt("id_detalle"),
						   rs.getInt("id_producto"), rs.getInt("id_talle"),
						   rs.getString("fecha_pedido"), rs.getInt("cantidad"),
						   rs.getDouble("entrega"), rs.getString("estado"));
			}
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return null;
	}

	public static Vector getPedidos(int id_f){
		Vector pedidos = null;
		try{
			Statement st = Conexion.getStatement();
			String sentencia = "SELECT * FROM pedido "+							   "WHERE id_ficha = "+id_f;
			ResultSet rs = st.executeQuery(sentencia);
			while( rs.next() ){
				if( pedidos == null ) pedidos = new Vector();
				pedidos.addElement( new Pedido(rs.getInt("id_pedido"),
									rs.getInt("id_ficha"),
									rs.getInt("id_compra"),
									rs.getInt("id_detalle"),
									rs.getInt("id_producto"),
									rs.getInt("id_talle"),
									rs.getString("fecha_pedido"),
									rs.getInt("cantidad"),
									rs.getDouble("entrega"),
									rs.getString("estado")));
			}
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return pedidos;
	}

	public static Vector getPedidoPorProducto(int id_p){
		Vector pedidos = null;
		try{
			Statement st = Conexion.getStatement();
			String sentencia = "SELECT * FROM pedido "+							   "WHERE id_producto = "+id_p;
			ResultSet rs = st.executeQuery(sentencia);
			while( rs.next() ){
				if( pedidos == null ) pedidos = new Vector();
				pedidos.addElement( new Pedido(rs.getInt("id_pedido"),
									rs.getInt("id_ficha"),
									rs.getInt("id_compra"),
									rs.getInt("id_detalle"),
									rs.getInt("id_producto"),
									rs.getInt("id_talle"),
									rs.getString("fecha_pedido"),
									rs.getInt("cantidad"),
									rs.getDouble("entrega"),
									rs.getString("estado")));
			}
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return pedidos;
	}
	
	public static Vector getPedidosPendientes(){
		Vector pedidos = null;
		try{
			Statement st = Conexion.getStatement();
			String sentencia = "SELECT * " +							   "FROM pedido "+
							   "WHERE estado = '"+Utilidad.ESTADO_PEDIDO_PENDIENTE+
							   "' ORDER BY fecha_pedido";
			ResultSet rs = st.executeQuery(sentencia);
			while( rs.next() ){
				if( pedidos == null ) pedidos = new Vector();
				pedidos.addElement( new Pedido(rs.getInt("id_pedido"),
									rs.getInt("id_ficha"),
									rs.getInt("id_compra"),
									rs.getInt("id_detalle"),
									rs.getInt("id_producto"),
									rs.getInt("id_talle"),
									rs.getString("fecha_pedido"),
									rs.getInt("cantidad"),
									rs.getDouble("entrega"),
									rs.getString("estado")));
			}
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return pedidos;
	}

	public static Vector getPedidoComprados(){
		Vector pedidos = null;
		try{
			Statement st = Conexion.getStatement();
			String sentencia = "SELECT * FROM pedido "+
							   "WHERE estado = '"+Utilidad.ESTADO_PEDIDO_COMPRADO+"'";
			ResultSet rs = st.executeQuery(sentencia);
			while( rs.next() ){
				if( pedidos == null ) pedidos = new Vector();
				pedidos.addElement( new Pedido(rs.getInt("id_pedido"),
									rs.getInt("id_ficha"),
									rs.getInt("id_compra"),
									rs.getInt("id_detalle"),
									rs.getInt("id_producto"),
									rs.getInt("id_talle"),									
									rs.getString("fecha_pedido"),
									rs.getInt("cantidad"),
									rs.getDouble("entrega"),
									rs.getString("estado")));
			}
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return pedidos;
	}
	
	public static Vector getPedidosNoEntregados(int id_f){
		Vector pedidos = null;
		try{
			Statement st = Conexion.getStatement();
			String sentencia = "SELECT * FROM pedido "+
							   "WHERE id_ficha = "+id_f+" AND "+
							   "( estado = '"+Utilidad.ESTADO_PEDIDO_PENDIENTE+"' OR "+
							   "estado = '"+Utilidad.ESTADO_PEDIDO_COMPRADO+"')";
			ResultSet rs = st.executeQuery(sentencia);
			while( rs.next() ){
				if( pedidos == null ) pedidos = new Vector();
				pedidos.addElement( new Pedido(rs.getInt("id_pedido"),
									rs.getInt("id_ficha"),
									rs.getInt("id_compra"),
									rs.getInt("id_detalle"),
									rs.getInt("id_producto"),
									rs.getInt("id_talle"),
									rs.getString("fecha_pedido"),
									rs.getInt("cantidad"),
									rs.getDouble("entrega"),
									rs.getString("estado")));
			}
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return pedidos;
	}
	
	// SE LLAMA CON UN LISTADO DE PEDIDOS EN ESTADO PENDIENTE
	public static void siguienteEstadoPedidos(Vector pedidos){
		if( pedidos != null ){
			for( int i=0; i<pedidos.size(); i++)
				((Pedido)pedidos.elementAt(i)).siguienteEstado();
		}
	}

	// METODO GUARDAR DATOS DE LA CLASE *******************
	public int guardarDatos(){
		try{
			Statement st = Conexion.getStatement();
			String sentencia;
			if(this.id_pedido == 0 ){
				sentencia = "INSERT INTO pedido VALUES(0,"+this.id_ficha+
							","+this.id_compra+","+this.id_detalle+
							","+this.id_producto+","+this.id_talle+",'"+
							this.fecha_pedido+"',"+this.cantidad+","+
							this.entrega+",'"+this.estado+"')";
				st.executeUpdate(sentencia);
				ResultSet rs = st.getGeneratedKeys();
				if( rs.next() ) this.id_pedido = rs.getInt(1);
			}
			else{
				sentencia = "UPDATE pedido SET id_compra = "+this.id_compra+
							", id_detalle = "+this.id_detalle+							", id_producto = "+this.id_producto+
							", id_talle = "+this.id_talle+
							", fecha_pedido = '"+this.fecha_pedido+
							"', cantidad = "+this.cantidad+
							", entrega = "+this.entrega+
							", estado = '"+this.estado+
							"' WHERE id_pedido = "+this.id_pedido+
							" AND id_ficha = "+this.id_ficha;
				st.executeUpdate(sentencia);
			}
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return this.id_pedido;		
	}
	
	// METODO ELIMINAR DE LA CLASE ************************
	public boolean eliminar(){
		try{
			if( this.id_pedido == 0 ) return false;
			
			Statement st = Conexion.getStatement();
			String sentencia = "DELETE FROM pedido WHERE id_pedido = "+this.id_pedido+
							   " AND id_ficha = "+this.id_ficha;
			st.executeUpdate(sentencia);
			this.id_pedido = 0;
			
			return true;
		}
		catch(SQLException e){
			System.out.println(e.getMessage());
		}
		return false;			
	}	

}
